{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "430cc9a5",
   "metadata": {},
   "source": [
    "# Work with meta-information"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "791f7042",
   "metadata": {},
   "source": [
    "Nabla2DFT includes three independent datasets. You can mix data from several datasets and fuse records together using unique identifiers of the molecule and conformation.\n",
    "\n",
    "Each record has two IDs:\n",
    "\n",
    "- moses_id is an index of molecules in the MOSES database.\n",
    "- conformation_id is an index of conformation for the specific molecule.\n",
    "\n",
    "Order of records in nablaDFT databases are incompatible, but `moses_id` and `conformation_id` are unique identifiers of conformation and molecule across all databases.\n",
    "\n",
    "Records in the dataset of optimization trajectories have `iteration`. This is a numerical identifier for molecular configuration in the optimization trajectory."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5edc5c63",
   "metadata": {},
   "outputs": [],
   "source": [
    "from ase.db import connect"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c9123764",
   "metadata": {},
   "source": [
    "Some meta-information includes energy databases and is accessible with the Atomic Simulation Environment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "08b5bebf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'moses_id': 164, 'conformation_id': 0, 'smiles': 'CCOC(=O)C1CN(Cc2ccccc2)C(=O)C1=O'}\n",
      "{'_distance_unit': 'Ang', '_property_unit_dict': {'energy': 'Hartree', 'forces': 'Hartree/Ang'}}\n"
     ]
    }
   ],
   "source": [
    "with connect(\"train_2k_v2_formation_energy_w_forces.db\") as train_db:\n",
    "    atom_row = train_db.get(1)\n",
    "    print(atom_row.key_value_pairs)\n",
    "    print(train_db.metadata)\n",
    "    # row = atom_row.toatoms()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3040ba79",
   "metadata": {},
   "source": [
    "In advance, you can work with SMILES, the energy dictionary of PSI4, the HOMO-LUMO gap, dipoles, and other parameters of molecule and conformation via `summary.csv` (1,86G in .gz format). This file is much smaller in comparison with databases or the full dataset of raw PSI4 wavefunctions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "800e1af2",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--2024-06-12 15:58:16--  http://a002dlils-kadurin-nabladft.obs.ru-moscow-1.hc.sbercloud.ru/data/nablaDFTv2/summary.csv.gz\n",
      "Resolving a002dlils-kadurin-nabladft.obs.ru-moscow-1.hc.sbercloud.ru (a002dlils-kadurin-nabladft.obs.ru-moscow-1.hc.sbercloud.ru)... 46.243.206.34, 46.243.206.35\n",
      "Connecting to a002dlils-kadurin-nabladft.obs.ru-moscow-1.hc.sbercloud.ru (a002dlils-kadurin-nabladft.obs.ru-moscow-1.hc.sbercloud.ru)|46.243.206.34|:80... connected.\n",
      "HTTP request sent, awaiting response... 200 OK\n",
      "Length: 1997105126 (1,9G) [binary/octet-stream]\n",
      "Saving to: ‘summary.csv.gz.1’\n",
      "\n",
      "summary.csv.gz.1      0%[                    ]   6,17M  5,37MB/s               ^C\n",
      "gzip: summary.csv already exists; do you wish to overwrite (y or n)? ^C\n"
     ]
    }
   ],
   "source": [
    "!wget http://a002dlils-kadurin-nabladft.obs.ru-moscow-1.hc.sbercloud.ru/data/nablaDFTv2/summary.csv.gz\n",
    "!gzip -d summary.csv.gz"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "cbc57454",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pylab as plt\n",
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "d22e101b",
   "metadata": {},
   "outputs": [],
   "source": [
    "summary = pd.read_csv(\"summary.csv\", index_col=0, nrows=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "69d36d27",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['MOSES id', 'CONFORMER id', 'archive name', 'DFT TOTAL ENERGY',\n",
       "       'DFT XC ENERGY', 'DFT NUCLEAR REPULSION ENERGY',\n",
       "       'DFT ONE-ELECTRON ENERGY', 'DFT TWO-ELECTRON ENERGY', 'DFT DIPOLE X',\n",
       "       'DFT DIPOLE Y', 'DFT DIPOLE Z', 'DFT TOTAL DIPOLE',\n",
       "       'DFT ROT CONSTANT A', 'DFT ROT CONSTANT B', 'DFT ROT CONSTANT C',\n",
       "       'DFT HOMO', 'DFT LUMO', 'DFT HOMO-LUMO GAP', 'DFT ATOMIC ENERGY',\n",
       "       'DFT FORMATION ENERGY', 'SMILES', 'SPLITS'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summary.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a2be8d3b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>MOSES id</th>\n",
       "      <th>CONFORMER id</th>\n",
       "      <th>SMILES</th>\n",
       "      <th>SPLITS</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1</td>\n",
       "      <td>test_full_conformations</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>26</td>\n",
       "      <td>4</td>\n",
       "      <td>CC(c1ncncc1F)C(O)(Cn1cncn1)c1ccc(F)cc1F</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>26</td>\n",
       "      <td>5</td>\n",
       "      <td>CC(c1ncncc1F)C(O)(Cn1cncn1)c1ccc(F)cc1F</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>26</td>\n",
       "      <td>6</td>\n",
       "      <td>CC(c1ncncc1F)C(O)(Cn1cncn1)c1ccc(F)cc1F</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>98</th>\n",
       "      <td>26</td>\n",
       "      <td>7</td>\n",
       "      <td>CC(c1ncncc1F)C(O)(Cn1cncn1)c1ccc(F)cc1F</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99</th>\n",
       "      <td>26</td>\n",
       "      <td>8</td>\n",
       "      <td>CC(c1ncncc1F)C(O)(Cn1cncn1)c1ccc(F)cc1F</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>100 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    MOSES id  CONFORMER id                                   SMILES  \\\n",
       "0          1             0     CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1   \n",
       "1          1             1     CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1   \n",
       "2          1             2     CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1   \n",
       "3          1             3     CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1   \n",
       "4          1             4     CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1   \n",
       "..       ...           ...                                      ...   \n",
       "95        26             4  CC(c1ncncc1F)C(O)(Cn1cncn1)c1ccc(F)cc1F   \n",
       "96        26             5  CC(c1ncncc1F)C(O)(Cn1cncn1)c1ccc(F)cc1F   \n",
       "97        26             6  CC(c1ncncc1F)C(O)(Cn1cncn1)c1ccc(F)cc1F   \n",
       "98        26             7  CC(c1ncncc1F)C(O)(Cn1cncn1)c1ccc(F)cc1F   \n",
       "99        26             8  CC(c1ncncc1F)C(O)(Cn1cncn1)c1ccc(F)cc1F   \n",
       "\n",
       "                     SPLITS  \n",
       "0                train_full  \n",
       "1                train_full  \n",
       "2                train_full  \n",
       "3                train_full  \n",
       "4   test_full_conformations  \n",
       "..                      ...  \n",
       "95               train_full  \n",
       "96               train_full  \n",
       "97               train_full  \n",
       "98               train_full  \n",
       "99               train_full  \n",
       "\n",
       "[100 rows x 4 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summary[[\"MOSES id\", \"CONFORMER id\", \"SMILES\", \"SPLITS\"]]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0b81f13b",
   "metadata": {},
   "source": [
    "You can plot and analyze information directly from the .csv file. SPLITS column includes tag to identify splits of the records."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "a913e0d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "summary = pd.read_csv(\"summary.csv\", index_col=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "87e5951a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>MOSES id</th>\n",
       "      <th>CONFORMER id</th>\n",
       "      <th>archive name</th>\n",
       "      <th>DFT TOTAL ENERGY</th>\n",
       "      <th>DFT XC ENERGY</th>\n",
       "      <th>DFT NUCLEAR REPULSION ENERGY</th>\n",
       "      <th>DFT ONE-ELECTRON ENERGY</th>\n",
       "      <th>DFT TWO-ELECTRON ENERGY</th>\n",
       "      <th>DFT DIPOLE X</th>\n",
       "      <th>DFT DIPOLE Y</th>\n",
       "      <th>...</th>\n",
       "      <th>DFT ROT CONSTANT A</th>\n",
       "      <th>DFT ROT CONSTANT B</th>\n",
       "      <th>DFT ROT CONSTANT C</th>\n",
       "      <th>DFT HOMO</th>\n",
       "      <th>DFT LUMO</th>\n",
       "      <th>DFT HOMO-LUMO GAP</th>\n",
       "      <th>DFT ATOMIC ENERGY</th>\n",
       "      <th>DFT FORMATION ENERGY</th>\n",
       "      <th>SMILES</th>\n",
       "      <th>SPLITS</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>data/moses_wfns/archive_0_0_0.tar</td>\n",
       "      <td>-1300.896067</td>\n",
       "      <td>-102.375307</td>\n",
       "      <td>1658.713422</td>\n",
       "      <td>-5071.516025</td>\n",
       "      <td>2214.311790</td>\n",
       "      <td>-1.806337</td>\n",
       "      <td>-3.755724</td>\n",
       "      <td>...</td>\n",
       "      <td>0.018157</td>\n",
       "      <td>0.004653</td>\n",
       "      <td>0.004180</td>\n",
       "      <td>-0.311180</td>\n",
       "      <td>0.017776</td>\n",
       "      <td>0.328956</td>\n",
       "      <td>-1294.500711</td>\n",
       "      <td>-6.395356</td>\n",
       "      <td>CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>data/moses_wfns/archive_0_0_0.tar</td>\n",
       "      <td>-1300.899902</td>\n",
       "      <td>-102.429213</td>\n",
       "      <td>1680.799786</td>\n",
       "      <td>-5115.351584</td>\n",
       "      <td>2236.111433</td>\n",
       "      <td>-0.686522</td>\n",
       "      <td>-3.981607</td>\n",
       "      <td>...</td>\n",
       "      <td>0.015678</td>\n",
       "      <td>0.005575</td>\n",
       "      <td>0.004542</td>\n",
       "      <td>-0.302982</td>\n",
       "      <td>0.018677</td>\n",
       "      <td>0.321659</td>\n",
       "      <td>-1294.500711</td>\n",
       "      <td>-6.399191</td>\n",
       "      <td>CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>data/moses_wfns/archive_0_0_0.tar</td>\n",
       "      <td>-1300.904099</td>\n",
       "      <td>-102.418626</td>\n",
       "      <td>1659.441723</td>\n",
       "      <td>-5073.046880</td>\n",
       "      <td>2215.149221</td>\n",
       "      <td>-2.391864</td>\n",
       "      <td>-2.333644</td>\n",
       "      <td>...</td>\n",
       "      <td>0.017954</td>\n",
       "      <td>0.004708</td>\n",
       "      <td>0.004167</td>\n",
       "      <td>-0.311098</td>\n",
       "      <td>0.018097</td>\n",
       "      <td>0.329195</td>\n",
       "      <td>-1294.500711</td>\n",
       "      <td>-6.403388</td>\n",
       "      <td>CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>data/moses_wfns/archive_0_0_0.tar</td>\n",
       "      <td>-1300.897094</td>\n",
       "      <td>-102.430203</td>\n",
       "      <td>1679.790185</td>\n",
       "      <td>-5113.238802</td>\n",
       "      <td>2235.012044</td>\n",
       "      <td>0.788940</td>\n",
       "      <td>-3.194971</td>\n",
       "      <td>...</td>\n",
       "      <td>0.015418</td>\n",
       "      <td>0.005608</td>\n",
       "      <td>0.004613</td>\n",
       "      <td>-0.302444</td>\n",
       "      <td>0.019934</td>\n",
       "      <td>0.322378</td>\n",
       "      <td>-1294.500711</td>\n",
       "      <td>-6.396383</td>\n",
       "      <td>CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>data/moses_wfns/archive_0_0_0.tar</td>\n",
       "      <td>-1300.894981</td>\n",
       "      <td>-102.449810</td>\n",
       "      <td>1685.260907</td>\n",
       "      <td>-5124.555389</td>\n",
       "      <td>2240.880631</td>\n",
       "      <td>-3.211841</td>\n",
       "      <td>0.104902</td>\n",
       "      <td>...</td>\n",
       "      <td>0.018241</td>\n",
       "      <td>0.005084</td>\n",
       "      <td>0.004491</td>\n",
       "      <td>-0.307153</td>\n",
       "      <td>0.019568</td>\n",
       "      <td>0.326721</td>\n",
       "      <td>-1294.500711</td>\n",
       "      <td>-6.394270</td>\n",
       "      <td>CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12676258</th>\n",
       "      <td>1936961</td>\n",
       "      <td>6</td>\n",
       "      <td>data/moses_wfns_big/wfns_moses_conformers_arch...</td>\n",
       "      <td>-1105.745861</td>\n",
       "      <td>-106.387328</td>\n",
       "      <td>2115.424745</td>\n",
       "      <td>-5707.709936</td>\n",
       "      <td>2592.963455</td>\n",
       "      <td>1.034399</td>\n",
       "      <td>-0.675494</td>\n",
       "      <td>...</td>\n",
       "      <td>0.009904</td>\n",
       "      <td>0.004782</td>\n",
       "      <td>0.003580</td>\n",
       "      <td>-0.321370</td>\n",
       "      <td>0.049091</td>\n",
       "      <td>0.370461</td>\n",
       "      <td>-1097.647221</td>\n",
       "      <td>-8.098641</td>\n",
       "      <td>CC(NC(=O)OC(C)(C)C)c1nc(CO)nn1Cc1ccccc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12676259</th>\n",
       "      <td>1936961</td>\n",
       "      <td>7</td>\n",
       "      <td>data/moses_wfns_big/wfns_moses_conformers_arch...</td>\n",
       "      <td>-1105.752018</td>\n",
       "      <td>-106.424034</td>\n",
       "      <td>2135.021265</td>\n",
       "      <td>-5746.548140</td>\n",
       "      <td>2612.236577</td>\n",
       "      <td>1.333813</td>\n",
       "      <td>-4.279909</td>\n",
       "      <td>...</td>\n",
       "      <td>0.011478</td>\n",
       "      <td>0.004750</td>\n",
       "      <td>0.003623</td>\n",
       "      <td>-0.322147</td>\n",
       "      <td>0.042127</td>\n",
       "      <td>0.364274</td>\n",
       "      <td>-1097.647221</td>\n",
       "      <td>-8.104797</td>\n",
       "      <td>CC(NC(=O)OC(C)(C)C)c1nc(CO)nn1Cc1ccccc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12676260</th>\n",
       "      <td>1936961</td>\n",
       "      <td>8</td>\n",
       "      <td>data/moses_wfns_big/wfns_moses_conformers_arch...</td>\n",
       "      <td>-1105.732389</td>\n",
       "      <td>-106.403981</td>\n",
       "      <td>2099.174980</td>\n",
       "      <td>-5674.970284</td>\n",
       "      <td>2576.504118</td>\n",
       "      <td>2.002324</td>\n",
       "      <td>-3.222680</td>\n",
       "      <td>...</td>\n",
       "      <td>0.010857</td>\n",
       "      <td>0.004202</td>\n",
       "      <td>0.003374</td>\n",
       "      <td>-0.323588</td>\n",
       "      <td>0.042082</td>\n",
       "      <td>0.365670</td>\n",
       "      <td>-1097.647221</td>\n",
       "      <td>-8.085169</td>\n",
       "      <td>CC(NC(=O)OC(C)(C)C)c1nc(CO)nn1Cc1ccccc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12676261</th>\n",
       "      <td>1936961</td>\n",
       "      <td>9</td>\n",
       "      <td>data/moses_wfns_big/wfns_moses_conformers_arch...</td>\n",
       "      <td>-1105.740275</td>\n",
       "      <td>-106.453281</td>\n",
       "      <td>2100.124252</td>\n",
       "      <td>-5677.147649</td>\n",
       "      <td>2577.772667</td>\n",
       "      <td>-0.255102</td>\n",
       "      <td>-1.570945</td>\n",
       "      <td>...</td>\n",
       "      <td>0.010969</td>\n",
       "      <td>0.004118</td>\n",
       "      <td>0.003472</td>\n",
       "      <td>-0.316804</td>\n",
       "      <td>0.045990</td>\n",
       "      <td>0.362794</td>\n",
       "      <td>-1097.647221</td>\n",
       "      <td>-8.093055</td>\n",
       "      <td>CC(NC(=O)OC(C)(C)C)c1nc(CO)nn1Cc1ccccc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12676263</th>\n",
       "      <td>1936961</td>\n",
       "      <td>11</td>\n",
       "      <td>data/moses_wfns_big/wfns_moses_conformers_arch...</td>\n",
       "      <td>-1105.764801</td>\n",
       "      <td>-106.382347</td>\n",
       "      <td>2113.690711</td>\n",
       "      <td>-5704.633344</td>\n",
       "      <td>2591.596287</td>\n",
       "      <td>0.839699</td>\n",
       "      <td>1.546168</td>\n",
       "      <td>...</td>\n",
       "      <td>0.009077</td>\n",
       "      <td>0.005015</td>\n",
       "      <td>0.003879</td>\n",
       "      <td>-0.324691</td>\n",
       "      <td>0.051392</td>\n",
       "      <td>0.376082</td>\n",
       "      <td>-1097.647221</td>\n",
       "      <td>-8.117581</td>\n",
       "      <td>CC(NC(=O)OC(C)(C)C)c1nc(CO)nn1Cc1ccccc1</td>\n",
       "      <td>train_full</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8349575 rows × 22 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          MOSES id  CONFORMER id  \\\n",
       "0                1             0   \n",
       "1                1             1   \n",
       "2                1             2   \n",
       "3                1             3   \n",
       "5                1             5   \n",
       "...            ...           ...   \n",
       "12676258   1936961             6   \n",
       "12676259   1936961             7   \n",
       "12676260   1936961             8   \n",
       "12676261   1936961             9   \n",
       "12676263   1936961            11   \n",
       "\n",
       "                                               archive name  DFT TOTAL ENERGY  \\\n",
       "0                         data/moses_wfns/archive_0_0_0.tar      -1300.896067   \n",
       "1                         data/moses_wfns/archive_0_0_0.tar      -1300.899902   \n",
       "2                         data/moses_wfns/archive_0_0_0.tar      -1300.904099   \n",
       "3                         data/moses_wfns/archive_0_0_0.tar      -1300.897094   \n",
       "5                         data/moses_wfns/archive_0_0_0.tar      -1300.894981   \n",
       "...                                                     ...               ...   \n",
       "12676258  data/moses_wfns_big/wfns_moses_conformers_arch...      -1105.745861   \n",
       "12676259  data/moses_wfns_big/wfns_moses_conformers_arch...      -1105.752018   \n",
       "12676260  data/moses_wfns_big/wfns_moses_conformers_arch...      -1105.732389   \n",
       "12676261  data/moses_wfns_big/wfns_moses_conformers_arch...      -1105.740275   \n",
       "12676263  data/moses_wfns_big/wfns_moses_conformers_arch...      -1105.764801   \n",
       "\n",
       "          DFT XC ENERGY  DFT NUCLEAR REPULSION ENERGY  \\\n",
       "0           -102.375307                   1658.713422   \n",
       "1           -102.429213                   1680.799786   \n",
       "2           -102.418626                   1659.441723   \n",
       "3           -102.430203                   1679.790185   \n",
       "5           -102.449810                   1685.260907   \n",
       "...                 ...                           ...   \n",
       "12676258    -106.387328                   2115.424745   \n",
       "12676259    -106.424034                   2135.021265   \n",
       "12676260    -106.403981                   2099.174980   \n",
       "12676261    -106.453281                   2100.124252   \n",
       "12676263    -106.382347                   2113.690711   \n",
       "\n",
       "          DFT ONE-ELECTRON ENERGY  DFT TWO-ELECTRON ENERGY  DFT DIPOLE X  \\\n",
       "0                    -5071.516025              2214.311790     -1.806337   \n",
       "1                    -5115.351584              2236.111433     -0.686522   \n",
       "2                    -5073.046880              2215.149221     -2.391864   \n",
       "3                    -5113.238802              2235.012044      0.788940   \n",
       "5                    -5124.555389              2240.880631     -3.211841   \n",
       "...                           ...                      ...           ...   \n",
       "12676258             -5707.709936              2592.963455      1.034399   \n",
       "12676259             -5746.548140              2612.236577      1.333813   \n",
       "12676260             -5674.970284              2576.504118      2.002324   \n",
       "12676261             -5677.147649              2577.772667     -0.255102   \n",
       "12676263             -5704.633344              2591.596287      0.839699   \n",
       "\n",
       "          DFT DIPOLE Y  ...  DFT ROT CONSTANT A  DFT ROT CONSTANT B  \\\n",
       "0            -3.755724  ...            0.018157            0.004653   \n",
       "1            -3.981607  ...            0.015678            0.005575   \n",
       "2            -2.333644  ...            0.017954            0.004708   \n",
       "3            -3.194971  ...            0.015418            0.005608   \n",
       "5             0.104902  ...            0.018241            0.005084   \n",
       "...                ...  ...                 ...                 ...   \n",
       "12676258     -0.675494  ...            0.009904            0.004782   \n",
       "12676259     -4.279909  ...            0.011478            0.004750   \n",
       "12676260     -3.222680  ...            0.010857            0.004202   \n",
       "12676261     -1.570945  ...            0.010969            0.004118   \n",
       "12676263      1.546168  ...            0.009077            0.005015   \n",
       "\n",
       "          DFT ROT CONSTANT C  DFT HOMO  DFT LUMO  DFT HOMO-LUMO GAP  \\\n",
       "0                   0.004180 -0.311180  0.017776           0.328956   \n",
       "1                   0.004542 -0.302982  0.018677           0.321659   \n",
       "2                   0.004167 -0.311098  0.018097           0.329195   \n",
       "3                   0.004613 -0.302444  0.019934           0.322378   \n",
       "5                   0.004491 -0.307153  0.019568           0.326721   \n",
       "...                      ...       ...       ...                ...   \n",
       "12676258            0.003580 -0.321370  0.049091           0.370461   \n",
       "12676259            0.003623 -0.322147  0.042127           0.364274   \n",
       "12676260            0.003374 -0.323588  0.042082           0.365670   \n",
       "12676261            0.003472 -0.316804  0.045990           0.362794   \n",
       "12676263            0.003879 -0.324691  0.051392           0.376082   \n",
       "\n",
       "          DFT ATOMIC ENERGY  DFT FORMATION ENERGY  \\\n",
       "0              -1294.500711             -6.395356   \n",
       "1              -1294.500711             -6.399191   \n",
       "2              -1294.500711             -6.403388   \n",
       "3              -1294.500711             -6.396383   \n",
       "5              -1294.500711             -6.394270   \n",
       "...                     ...                   ...   \n",
       "12676258       -1097.647221             -8.098641   \n",
       "12676259       -1097.647221             -8.104797   \n",
       "12676260       -1097.647221             -8.085169   \n",
       "12676261       -1097.647221             -8.093055   \n",
       "12676263       -1097.647221             -8.117581   \n",
       "\n",
       "                                           SMILES      SPLITS  \n",
       "0            CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1  train_full  \n",
       "1            CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1  train_full  \n",
       "2            CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1  train_full  \n",
       "3            CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1  train_full  \n",
       "5            CC(C)(C)C(=O)C(Oc1ccc(Cl)cc1)n1ccnc1  train_full  \n",
       "...                                           ...         ...  \n",
       "12676258  CC(NC(=O)OC(C)(C)C)c1nc(CO)nn1Cc1ccccc1  train_full  \n",
       "12676259  CC(NC(=O)OC(C)(C)C)c1nc(CO)nn1Cc1ccccc1  train_full  \n",
       "12676260  CC(NC(=O)OC(C)(C)C)c1nc(CO)nn1Cc1ccccc1  train_full  \n",
       "12676261  CC(NC(=O)OC(C)(C)C)c1nc(CO)nn1Cc1ccccc1  train_full  \n",
       "12676263  CC(NC(=O)OC(C)(C)C)c1nc(CO)nn1Cc1ccccc1  train_full  \n",
       "\n",
       "[8349575 rows x 22 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_full = summary[summary[\"SPLITS\"] == \"train_full\"]\n",
    "train_full"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "b1050791",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of molecules: 1485014\n",
      "Number of conformations: 8349575\n"
     ]
    }
   ],
   "source": [
    "print(f\"Number of molecules: {len(np.unique(train_full['MOSES id']))}\")\n",
    "print(f\"Number of conformations: {len(train_full['CONFORMER id'])}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "50ce58d3",
   "metadata": {},
   "outputs": [],
   "source": [
    "dict_id_conf = {}\n",
    "\n",
    "for id_, conf_id_ in zip(train_full[\"MOSES id\"], train_full[\"CONFORMER id\"]):\n",
    "    if id_ not in dict_id_conf:\n",
    "        dict_id_conf[id_] = 0\n",
    "    dict_id_conf[id_] += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "35436d1f",
   "metadata": {},
   "outputs": [],
   "source": [
    "num_of_conf = [ci for i, ci in dict_id_conf.items()]\n",
    "\n",
    "dict_conf_size = {}\n",
    "\n",
    "for id_ in num_of_conf:\n",
    "    if id_ not in dict_conf_size:\n",
    "        dict_conf_size[id_] = 0\n",
    "    dict_conf_size[id_] += 1\n",
    "\n",
    "dict_conf_size = np.array(list(dict_conf_size.items()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "27f7864c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 0, 'Number of conformations per molecule')"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(dict_conf_size[:, 0], dict_conf_size[:, 1])\n",
    "plt.title(\"Distribution of conformations in the `train_full` split\")\n",
    "plt.ylabel(\"Number of molecules\")\n",
    "plt.xlabel(\"Number of conformations per molecule\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f09eb6e1",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "docs2",
   "language": "python",
   "name": "docs2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
